/**
 * JServer.java    02/03/2012
 */

package l3.info.Projet.Serveur;

import java.awt.Color;
import java.awt.Dimension;
import java.awt.FlowLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.rmi.RemoteException;

import javax.swing.BorderFactory;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JMenu;
import javax.swing.JMenuBar;
import javax.swing.JMenuItem;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JTextPane;
import l3.info.Projet.Client.JDAPropos;
import l3.info.Projet.Utilitaires.Configuration;

/**
 * Interface graphique du serveur (permet de le lancer ou de l'arrêter)
 * @author Loïc Martinez
 * @version 1.0
 */

public class JServer extends JFrame implements ActionListener {

    /** Constantes */
    private static final String TITRE = "Serveur";
    private static final int LARGEUR = 290;
    private static final int HAUTEUR = 290;
    private static final int ABSCISSE = 500;
    private static final int ORDONNEE = 200;
    private static final String LANCER = "Lancer";
    private static final String ARRETER = "Arrêter";
    private static final String QUITTER = "Quitter";
    private static final String[] attributsConfig =
        {"database", "user", "password", "port"};

    /** Composants de la JFrame */
    private JTextPane textPane;
    private JButton boutonLancement, boutonArret, boutonQuitter;
    private JPanel firstPan, panBouton, panField, panFinal;
    private JMenuBar menuBar;
    private JMenu menuFichier;
    private JMenu menuAide;
    private JMenu menuOption;
    private JMenuItem menuQuitter;
    private JMenuItem menuPreferences;
    private JMenuItem menuAPropos;

    /** Permet de ramener les données de la base de données */
    private ServeurRequetes serveur;

    /** Attributs de configuration dans le fichier texte
     * sevreurPreferences.properties
     */
    private String database, user, password;
    private int port;

    /** Permet de savoir si le serveur est lancé ou non */
    private boolean estLance = false;

    /** La configuration du serveur */
    private Configuration conf;

    /**
     * Constructeur par défaut
     */
    public JServer() {
        conf = new Configuration("configServer.properties", attributsConfig);
        setProperties();
        getContentPane().setLayout(new FlowLayout());

        // On ajoute les différents composants dans la JFrame
        setButton(FlowLayout.CENTER);
        setArea(FlowLayout.CENTER);
        setQuitButton(FlowLayout.RIGHT);
        setEnter();

        setVisible(true);
    }

    /**
     * Configuration des propriétés de la JFrame
     */
    private void setProperties() {

        try {
            serveur = new ServeurRequetes("serveur");
        } catch (RemoteException ex) {
            // TODO Auto-generated catch block
            ex.printStackTrace();
        }

        // Configuration de la JFrame
        setTitle(TITRE);
        setLocation(ABSCISSE, ORDONNEE);
        setSize(LARGEUR, HAUTEUR);
        setResizable(false);
        setDefaultCloseOperation(DISPOSE_ON_CLOSE);
        addMenuBar();

        // Ajout du 1er JPanel pour qu'il y ait un peu d'espace
        // avec le haut de la JFrame
        firstPan = new JPanel(new FlowLayout());
        firstPan.setPreferredSize(new Dimension(LARGEUR, 10));
        add(firstPan);

        // Database, User, Password
        database = conf.valueOf("database");
        user = conf.valueOf("user");
        password = conf.valueOf("password");
    }

    /**
     * Ajoute le menu Fichier, Options, Aide...
     */
    private void addMenuBar() {
        menuBar = new JMenuBar();
        menuFichier = new JMenu("Fichier");
        menuBar.add(menuFichier);

        menuOption = new JMenu("Options");
        menuBar.add(menuOption);

        menuAide = new JMenu("Aide");
        menuBar.add(menuAide);

        setJMenuBar(menuBar);

        menuQuitter = new JMenuItem("Quitter");
        menuFichier.add(menuQuitter);
        menuQuitter.addActionListener(this);

        menuPreferences = new JMenuItem("Préférences");
        menuOption.add(menuPreferences);
        menuPreferences.addActionListener(this);

        menuAPropos = new JMenuItem("A propos...");
        menuAide.add(menuAPropos);
        menuAPropos.addActionListener(this);
    }

    /**
     * Permet d'insérer les boutons dans leur pannel
     * @param alignement, l'alignement du panel
     */
    private void setButton(int alignement) {
        panBouton = new JPanel(new FlowLayout(alignement));
        panBouton.setPreferredSize(new Dimension(LARGEUR, 40));

        boutonLancement = new JButton(LANCER);
        panBouton.add(boutonLancement);

        boutonArret = new JButton(ARRETER);
        panBouton.add(boutonArret);

        boutonLancement.addActionListener(this);
        boutonArret.addActionListener(this);

        add(panBouton);
    }

    /**
     * Permet d'insérer le JTextPane
     * @param alignement, l'alignement du panel
     */
    private void setArea(int alignement) {
        panField = new JPanel(new FlowLayout(alignement));
        textPane = new JTextPane();
        textPane.setPreferredSize(new Dimension(240, 100));
        textPane.setBorder(BorderFactory.createLineBorder(Color.BLACK));
        textPane.setEditable(false);

        JScrollPane scroll = new JScrollPane(textPane);

        panField.add(scroll);

        add(panField);
    }

    /**
     * Permet d'insérer le bouton Quitter
     * @param alignement, l'alignement du panel
     */
    private void setQuitButton(int alignement) {
        panFinal = new JPanel(new FlowLayout(alignement));
        boutonQuitter = new JButton(QUITTER);

        panFinal.add(boutonQuitter);
        boutonQuitter.addActionListener(this);

        add(panFinal);
    }

    /**
     * Si on appuie sur Entrée, alors on déclenche le listener
     * du boutonLancement
     */
    public void setEnter() {
        getRootPane().setDefaultButton(boutonLancement);
    }

    /**
     * @param ev, l'évènement déclenché
     */
    public void actionPerformed(ActionEvent ev) {
        if (ev.getSource() == boutonQuitter || ev.getSource() == menuQuitter) {
            dispose();
        } else if (ev.getSource() == boutonLancement) {
            String log = textPane.getText().length() == 0 ?
                    textPane.getText() : textPane.getText() + "\n";

                    if (! estLance) {
                        try {
                            if (! serveur.getRegistryCree()) {
                                serveur = new ServeurRequetes("serveur", 1099);
                                serveur.setRegistryCree(true);
                            } else {
                                serveur.lancer();
                            }
                        } catch (RemoteException e) {
                            System.err.println("Erreur lancement du serveur");
                        }
                        log += "Serveur lancé !";
                        textPane.setText(log);
                        estLance = true;
                    } else {
                        log += "Serveur déjà lancé !";
                        textPane.setText(log);
                    }

        } else if (ev.getSource() == boutonArret) {
            String log = textPane.getText().length() == 0 ?
                    textPane.getText() : textPane.getText() + "\n";
                    if (estLance) {
                        serveur.arreter();
                        log += "Serveur arrêté !";
                        textPane.setText(log);
                        estLance = false;
                    } else {
                        log += "Le serveur n'est pas en fonction !";
                        textPane.setText(log);
                    }
        } else if (ev.getSource() == menuPreferences) {
            new JDPreferencesServeur(conf);
        } else if (ev.getSource() == menuAPropos) {
            new JDAPropos("Auteurs : Loic Martinez");
        }
    }

}
